/**
 * 
 */
package pruebas.VerduleriaOl.persistencia.jpa.entidades;

import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MapKeyJoinColumn;
import javax.persistence.TableGenerator;
import javax.persistence.Version;

import pruebas.VerduleriaOl.dominio.entidades.Carrito;
import pruebas.VerduleriaOl.dominio.entidades.TipoArticulo;
import pruebas.VerduleriaOl.dominio.incrustables.ItemCarrito;

import com.intelap.utils.DbgHlp;
import com.intelap.utils.ProductorRecursos;
import javax.persistence.CollectionTable;
import javax.persistence.JoinColumn;

/** @author ggpollit */
@Entity
@Access(AccessType.PROPERTY)
public class Carrito_Jpa extends Carrito {
	private static final Logger logger = ProductorRecursos.getLogger(Carrito_Jpa.class);

	public Carrito_Jpa() {
		logger.info("construyendo " + Carrito_Jpa.class.getSimpleName() + "#" + System.identityHashCode(this));
	}

	private long id;
	@Id
	@TableGenerator(name = "generadorIdsCarrito", table = "ULTIMOS_NUMS_SECUENCIA", pkColumnName = "NOMBRE", valueColumnName = "VALOR", pkColumnValue = "Carrito")
	@GeneratedValue(strategy = GenerationType.TABLE, generator = "generadorIdsCarrito")
	public long getId() {
		return this.id;
	}
	protected void setId(long id) {
		this.id = id;
	}

	protected int version;
	@Override
	@Version
	protected int getVersion() {
		return this.version;
	}
	@Override
	protected void setVersion(int version) {
		this.version = version;
	}

	private Map<TipoArticulo_Jpa, ItemCarrito> items = new HashMap<>();
	@Override
	@ElementCollection
	@CollectionTable(joinColumns = @JoinColumn(name = "Carrito_Jpa_id", referencedColumnName = "id"))
	@MapKeyJoinColumn(name = "items_key", referencedColumnName = "id")
	protected Map<TipoArticulo_Jpa, ItemCarrito> getItems() {
		this.registrarLeida();
		return items;
	}
	protected void setItems(Map<TipoArticulo_Jpa, ItemCarrito> items) {
		this.items = items;
	}
	@Override
	protected void agregarItem(TipoArticulo tipoArticulo, ItemCarrito itemCarrito) {
		this.registrarSucia();
		this.getItems().put((TipoArticulo_Jpa) tipoArticulo, itemCarrito);
	}
	@Override
	protected ItemCarrito quitarItem(TipoArticulo tipoArticulo) {
		this.registrarSucia();
		return this.getItems().remove(tipoArticulo);
	}


	@Override
	public String toString() {
		return DbgHlp.toString(this, "id", "version");
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (int) (getId() ^ (getId() >>> 32));
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof Carrito_Jpa))
			return false;
		Carrito_Jpa other = (Carrito_Jpa) obj;
		if (getId() != other.getId())
			return false;
		return getId() != 0;
	}


//	private boolean cargado = false;
//	@Override
//	@Transient
//	protected boolean isCargada() {
//		return this.cargado;
//	}
//	@SuppressWarnings("unused")
//	@PostLoad
//	private void finCarga() {
//		cargado = true;
//		logger.info("finalizó la carga de " + Carrito_Jpa.class.getSimpleName() + "#" + System.identityHashCode(this) + " con id="
//				+ this.getId()+", version="+this.getVersion());
//	}
}
